// object 表示一个js对象
let a: object;
a = {};
a = function () { };

// {} 用来指定对象中可以包含哪些属性
// 语法：{属性名:属性值,属性名:属性值}
// 在属性名后边加上?，表示属性是可选的
let b: { name: string, age?: number };

b = { name: "zhangsan" };

// [propName: string]: any 表示任意类型的属性
let c: { name: string, [propName: string]: any };
c = { name: "zhangsan", age: 10 }

/**
 * 设置函数结构的类型声明：
 *     语法：(形参:类型,形参:类型...) => 返回值类型
 * */ 
let func: (a: number, b: number) => number;
func = function (n1, n2) {
  return n1 + n2;
}

/**
 * 数组类型的声明：
 *     类型[]
 *     Array<类型>
 * 
 * */ 
// string[] 表示字符串数组
let strArr: string[];
let strArr2: Array<string>;
strArr2 = ["a", "b", "c"];

// number[] 表示数值数组
let numArr: number[];
let numArr2: Array<number>;
numArr2 = [1, 2, 3];

/**
 * 元祖，固定长度的数组(效率高点)
 *    语法：[类型,类型,类型]
 * */ 

let tupleArr: [string, number, boolean];
tupleArr = ["a", 1, true];


/**
 * enum 枚举
 * 
 * */ 
enum Gender{
    Male = 0,
    Female = 1
}
let en: { name: string, gender: Gender };
en = {
  name: "zhangsan",
  gender: Gender.Male
}

console.log(en.gender === Gender.Male);

// & 表示同时 
// let jj: string & number; 无意义
let jj: { name: string } & { age: number };
jj = { name: "zhangsan", age: 10 };


// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5;
let kk: myType;
let ll: myType;

// 20240318 p5 end